Bir java.nio.ByteBuffer a'yı (yeni oluşturulmuş) CharBuffer b veya char [] b'ye dönüştürmek için en hızlı yöntem nedir? Bunu yaparak, a [i] == b [i] olması önemlidir. Bu, a [i] ve a [i + 1] 'in birlikte bir b [j] değeri oluşturmadığı anlamına gelir, getChar (i) ne yapar, ancak değerler "spread" olmalıdır. bayt a [] = {1,2,3, 125,126,127, -128, -127, -126} // her biri bir bayt (imzalanmış) char b [] = {1,2,3, 125,126,127, 128, 129, 130} // her biri bir karakter (işaretsizdir) Bayt: -128'in char: 128 ile aynı (daha düşük 8) bitlere sahip olduğuna dikkat edin. Bu nedenle, "en iyi" yorumun yukarıda belirttiğim gibi olacağını varsayıyorum, çünkü bitler aynı. Bundan sonra, ters çeviriye de ihtiyacım var: Bir char [] veya java.nio.CharBuffer'ı java.nio.ByteBuffer'a geri almanın en etkili yolu.
2021-01-06 08:20:20
Yani, istediğiniz şey, ISO-8859-1 kodlamasını kullanarak dönüştürmek. Verimlilik hakkında hiçbir şey iddia etmiyorum, ama en azından yazmak oldukça kısa: CharBuffer sonucu = Charset.forName ("ISO-8859-1"). Decode (byteBuffer); Diğer yön şudur: ByteBuffer sonucu = Charset.forName ("ISO-8859-1"). Kodlama (charBuffer); Lütfen bunu diğer çözümlerle ölçün. (Adil olmak gerekirse, Charset.forName kısmı dahil edilmemeli ve ayrıca her tampon için tekrar değil, yalnızca bir kez yapılmalıdır.) Java 7'den, önceden başlatılmış Charset örneklerine sahip StandardCharsets sınıfı da vardır, böylece kullanabilirsiniz CharBuffer sonucu = StandardCharsets.ISO_8859_1.decode (byteBuffer); ve ByteBuffer sonucu = StandardCharsets.ISO_8859_1.encode (charBuffer); yerine. (Bu satırlar öncekilerin aynısını yapar, sadece arama daha kolaydır ve isimleri yanlış yazma riski yoktur ve imkansız istisnaları yakalamaya gerek yoktur.) | @ Ishtar's ile aynı fikirdeyim, yeni bir yapıya dönüştürmekten kaçınmanızı ve yalnızca ihtiyacınız olduğu kadar dönüştürmenizi öneririm. Ancak bir ByteBuffer yığınınız varsa bunu yapabilirsiniz. ByteBuffer bb = ... bayt [] dizi = bb.array (); karakter [] karakter = yeni karakter [bb.remaining ()]; for (int i = 0; i